package com.znxs.api_management_c.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.znxs.api_management_c.common.ErrorCode;
import com.znxs.api_management_c.exception.BusinessException;
import com.znxs.api_management_c.mapper.ApiInfoMapper;
import com.znxs.api_management_c.mapper.UserInfoMapper;
import com.znxs.api_management_c.model.DTO.ApiInfoUploadRequest;
import com.znxs.api_management_c.model.VO.ApiInfoVO;
import com.znxs.api_management_c.model.entity.ApiInfo;
import com.znxs.api_management_c.model.entity.UserInfo;
import com.znxs.api_management_c.service.ApiInfoService;
import com.znxs.api_management_c.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * @author znxs
 * @description 针对表【api_info】的数据库操作Service实现
 * @createDate 2024-07-03 14:26:16
 */
@Service
@Slf4j
public class ApiInfoServiceImpl extends ServiceImpl<ApiInfoMapper, ApiInfo>
        implements ApiInfoService {
    @Resource
    private ApiInfoMapper apiInfoMapper;

    @Resource
    private UserInfoMapper userInfoMapper;

    @Resource
    private UserInfoService userInfoService;

    @Override
    public List<ApiInfoVO> listApiInfo() {
        // 查询所有接口信息
        // todo 这里以后需要改进，不能直接查询所有接口信息，应该添加一个redis进行缓冲
        List<ApiInfo> apiInfos = this.list();
        if (apiInfos.isEmpty()) {
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "查询结果为空");
        }
        // 进行vo转换，并且添加用户名称 直接返回转换后的对象
        return this.apiInfoToApiInfoVOWithUsername(apiInfos);
    }

    @Override
    public List<ApiInfoVO> searchApiInfo(String searchTag) {
        // 匹配搜索信息 根据名称搜索，根据方法类型搜索，根据创建人搜索
        // 非空判断
        if (StringUtils.isEmpty(searchTag)) throw new BusinessException(ErrorCode.PARAMS_ERROR, "搜索内容不为空");
        // 进行搜索
        QueryWrapper<ApiInfo> apiInfoQueryWrapper = new QueryWrapper<>();
        apiInfoQueryWrapper.like("name", searchTag).or().like("method", searchTag);
        // TODO 这里需要进行优化，这样进行搜索太慢了
        // 根据用户名进行查询
        QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<>();
        userInfoQueryWrapper.select("id");
        userInfoQueryWrapper.like("name", searchTag).or().like("nickname", searchTag);
        List<ApiInfo> searchApiInfos;
        try {
            List<UserInfo> userInfos = userInfoMapper.selectList(userInfoQueryWrapper);
            // 获取查询到的用户信息id，使用apiQueryWrapper进行查询 这里不能使用模糊查询
            userInfos.forEach(userInfo -> apiInfoQueryWrapper.or().eq("userId", userInfo.getId()));
            searchApiInfos = apiInfoMapper.selectList(apiInfoQueryWrapper);
            searchApiInfos.forEach(System.out::println);
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "查询失败");
        }
        // 进行vo转换，并且添加用户名称 直接返回转换后的对象
        return this.apiInfoToApiInfoVOWithUsername(searchApiInfos);
    }


    @Override
    public int apiUpload(ApiInfoUploadRequest apiInfoUploadRequest, HttpServletRequest request) {
        // 非空判断
        if (apiInfoUploadRequest==null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"请求参数为空");
        }
        // 判断是否登录
        boolean isLogin = userInfoService.isLogin(request);
        if (isLogin) throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR,"未登录，请登录操作");
        // 插入操作
        ApiInfo apiInfo = new ApiInfo();
        BeanUtils.copyProperties(apiInfoUploadRequest, apiInfo);
        try {
            this.save(apiInfo);
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR,"上传失败");
        }
        return 1;
    }

    @Override
    public List<ApiInfoVO> apiInfoToApiInfoVOWithUsername(List<ApiInfo> apiInfos) {
        List<ApiInfoVO> allApiInfoVO = new ArrayList<ApiInfoVO>();
        for (ApiInfo apiInfo : apiInfos) {
            ApiInfoVO apiInfoVO = ApiInfoVO.objToVo(apiInfo);
            // 根据用户id查询用户
            try {
                UserInfo userInfo = userInfoMapper.selectById(apiInfo.getUserId());
                // 这里添加属性 给apiInfoVo加上UserNickName属性
                apiInfoVO.setUserNickName(userInfo.getNickname());
            } catch (Exception e) {
                throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "查询失败");
            }
            allApiInfoVO.add(apiInfoVO);
        }
        return allApiInfoVO;
    }



}




